﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;

namespace FlyShop
{
    public partial class FrmConsultaUsuario : Form
    {
        // Indica o código do registro selecionado na grid
        int codUsuarioSelecionadaGrid = -1;
        int codEnderecoSelecionadaGrid = -1;

        OleDbConnection conexao;
        OleDbCommand comando;
        OleDbDataAdapter daUs;
        DataSet dsUs;
        String strConexao = "Provider=MSDAORA.1;Data Source=localhost;User ID=pi;Password=pi";
        String sqlConsulta = "select p.cod_pessoa, p.nome, p.cpf, u.flag_ativo, p.data_nascimento, p.email, e.cod_endereco from pessoa p, usuario u, endereco e where p.cod_pessoa = u.cod_pessoa and p.cod_endereco = e.cod_endereco order by nome";
        String sqlConsultaFiltro = "select p.cod_pessoa, p.nome, p.cpf, u.flag_ativo, p.data_nascimento, p.email, e.cod_endereco from pessoa p, usuario u, endereco e where p.cod_pessoa = u.cod_pessoa and p.cod_endereco = e.cod_endereco and p.nome like ? and p.cpf like ? order by nome";
        String sqlExcluiRegistro = "delete from endereco where cod_endereco = ?";


        public FrmConsultaUsuario()
        {
            InitializeComponent();
        }

        private void FrmConsultaUsuario_Load(object sender, EventArgs e)
        {

            conexao = new OleDbConnection(strConexao);
            conexao.Open();

            OleDbCommand comandoAlteraSessao = new OleDbCommand("alter session set nls_sort=BINARY_CI", conexao);
            comandoAlteraSessao.ExecuteNonQuery();

            comandoAlteraSessao.CommandText = "alter session set nls_comp=LINGUISTIC";
            comandoAlteraSessao.ExecuteNonQuery();

            atualiza();
            formataGrid();
        }


        public void atualiza()
        {

            // Faz uma consulta por todos os registros
            daUs = new OleDbDataAdapter(sqlConsulta, conexao);
            dsUs = new DataSet();
            daUs.Fill(dsUs, "Usuario");
            dgvUsuario.DataSource = dsUs.Tables["Usuario"];


            // Limpa a seleção e a variável de indicação do código
            dgvUsuario.ClearSelection();
            codUsuarioSelecionadaGrid = -1;
            codEnderecoSelecionadaGrid = -1;

            // Limpa a label de mensagem e a imagem de notificação
            lblMensagem.Text = "";
            alertNotificacao.Hide();
            
        }

        private void FrmConsultaUsuario_FormClosed(object sender, FormClosedEventArgs e)
        {
            conexao.Close();
        }

        private void formataGrid()
        {
            dgvUsuario.Columns[0].Visible = false;
            dgvUsuario.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            dgvUsuario.Columns[1].HeaderText = "Nome";
            dgvUsuario.Columns[1].Width = 1;
            dgvUsuario.Columns[2].HeaderText = "CPF";
            dgvUsuario.Columns[2].Width = 80;
            dgvUsuario.Columns[3].HeaderText = "Usuário Ativo";
            dgvUsuario.Columns[3].Width = 70;
            dgvUsuario.Columns[4].HeaderText = "Data de Nascimento";
            dgvUsuario.Columns[4].Width = 70;
            dgvUsuario.Columns[5].HeaderText = "Email";
            dgvUsuario.Columns[5].Width = 180;
            dgvUsuario.Columns[6].Visible = false;
            dgvUsuario.ScrollBars = ScrollBars.Vertical;
            dgvUsuario.RowHeadersVisible = false;
            dgvUsuario.MultiSelect = false;
            dgvUsuario.AllowUserToAddRows = false;
            dgvUsuario.AllowUserToDeleteRows = false;
            dgvUsuario.ReadOnly = true;
            dgvUsuario.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            dgvUsuario.TabStop = false;
        }

        private void btnCadastrarUsuario_Click(object sender, EventArgs e)
        {
            FrmCadastroUsuario frmCadastro = new FrmCadastroUsuario();
            frmCadastro.Text = "Cadastro de usuário";
            frmCadastro.ShowDialog();
            atualiza();
        }

        private void btnAlterar_Click(object sender, EventArgs e)
        {

            if (codUsuarioSelecionadaGrid != -1)
            {
                FrmCadastroUsuario frmEdicao = new FrmCadastroUsuario();
                frmEdicao.Text = "Edição de usuário";
                frmEdicao.edicao = true;
                frmEdicao.codUsuario = codUsuarioSelecionadaGrid;
                frmEdicao.ShowDialog();
                atualiza();
            }
            else
            {
                lblMensagem.Text = "Selecione um registro para alterar.";
                alertNotificacao.Show();
            }
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            if (codEnderecoSelecionadaGrid != -1)
            {
                DialogResult drConfirmacao = MessageBox.Show(this, "Deseja excluir o registro selecionado?\nNão será possível excluir o registro caso ele tenha dependências.",
                "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                if (drConfirmacao == DialogResult.Yes)
                {
                    comando = new OleDbCommand(sqlExcluiRegistro, conexao);

                    OleDbParameter pCod = new OleDbParameter("cod_endereco", OleDbType.Integer);
                    pCod.Value = codEnderecoSelecionadaGrid;
                    comando.Parameters.Add(pCod);

                    // Caso o registro em questão tenha dependentes
                    // será lançada uma exceção
                    try
                    {
                        // Deleta em cascata
                        comando.ExecuteNonQuery();
                        atualiza();
                    }
                    catch (OleDbException)
                    {
                        MessageBox.Show(this, "Não é possível excluir um registro com dependentes.",
                            "Operação inválida", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    }
                }

            }
            else
            {
                lblMensagem.Text = "Selecione um registro para excluir.";
                alertNotificacao.Show();
            } 

        }

        private void dgvUsuario_CellClick(object sender, DataGridViewCellEventArgs e)
        {

            // Recupera o código da usuario pelo índice na grid
            try
            {
                codUsuarioSelecionadaGrid = Convert.ToInt32(dgvUsuario.Rows[e.RowIndex].Cells[0].Value);
            }
            catch (Exception)
            {
                codUsuarioSelecionadaGrid = -1;
            }

            // Recupera o código do endereco pelo índice na grid
            try
            {
                codEnderecoSelecionadaGrid = Convert.ToInt32(dgvUsuario.Rows[e.RowIndex].Cells[6].Value);
            }
            catch (Exception)
            {
                codEnderecoSelecionadaGrid = -1;
            }
        
        }

        private void Filtro_TextChanged(object sender, EventArgs e)
        {
            comando = new OleDbCommand(sqlConsultaFiltro, conexao);

            OleDbParameter pFiltroNome = new OleDbParameter("nome", OleDbType.VarChar);
            pFiltroNome.Value = txtNomeUsuario.Text.Trim() + "%";
            comando.Parameters.Add(pFiltroNome);

            OleDbParameter pFiltroCpf = new OleDbParameter("CPF", OleDbType.VarChar);
            // se não houver cpf.
            if (mtbCpf != null)
            {
                pFiltroCpf.Value = mtbCpf.Text + "%";
            }
            else
            {
                pFiltroCpf.Value = "%";
            }

            comando.Parameters.Add(pFiltroCpf);

            // passa o comando para o adapter
            daUs = new OleDbDataAdapter(comando);
            // limpa o dataset e o preenche com a tabela cidade
            dsUs.Clear();
            daUs.Fill(dsUs, "Usuario");

            dgvUsuario.DataSource = dsUs.Tables["Usuario"];
            formataGrid();
        }

        private void dgvUsuario_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (codUsuarioSelecionadaGrid != -1)
            {
                FrmCadastroUsuario frmEdicao = new FrmCadastroUsuario();
                frmEdicao.Text = "Edição de cliente";
                frmEdicao.edicao = true;
                frmEdicao.codUsuario = codUsuarioSelecionadaGrid;
                frmEdicao.ShowDialog();
                atualiza();
            }
            else
            {
                lblMensagem.Text = "Selecione um registro para alterar.";
                alertNotificacao.Show();
            }
        }

        private void dgvUsuario_Sorted(object sender, EventArgs e)
        {
            dgvUsuario.ClearSelection();
            codEnderecoSelecionadaGrid = -1;
            codUsuarioSelecionadaGrid = -1;
        }

        private void dgvUsuario_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            // Recupera o código da usuario pelo índice na grid
            try
            {
                codUsuarioSelecionadaGrid = Convert.ToInt32(dgvUsuario.Rows[e.RowIndex].Cells[0].Value);
            }
            catch (Exception)
            {
                codUsuarioSelecionadaGrid = -1;
            }

            // Recupera o código do endereco pelo índice na grid
            try
            {
                codEnderecoSelecionadaGrid = Convert.ToInt32(dgvUsuario.Rows[e.RowIndex].Cells[6].Value);
            }
            catch (Exception)
            {
                codEnderecoSelecionadaGrid = -1;
            }
        }

        private void FrmConsultaUsuario_KeyDown(object sender, KeyEventArgs e)
        {
            //Hotkey para a tecla ESC fechar a janela
            if (e.KeyData == (Keys.Escape))
            {
                this.Close();
            }

            //Hotkey para novo cadastro
            if (e.KeyData == (Keys.Control | Keys.N))
            {
                btnCadastrarUsuario_Click(sender, e);
            }
        }
    }
}
